home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / sviluppo / svilupp2 / amphn192.lha / src / compress / ADPCM2_Crunch.a < prev    next >
Text File  |  1996-11-16  |  2KB  |  98 lines

  1.  
  2.     ***   ADPCM2 sample compression routines    ****
  3.     *** Copyright (C) 1993 by Christian Buchner ****
  4.  
  5.  
  6.  
  7.     SECTION Code
  8.  
  9.  
  10.     *** CompressADPCM2 ***
  11.  
  12.     ; JoinCode = CompressADPCM2(Source, Length, Destination, JoinCode)
  13.     ; d0                          a0      d0      a1           d1
  14.     ;
  15.     ; This function compresses a RAW sample to a given memory. The
  16.     ; result is a 2bit ADPCM code. The destination buffer must be
  17.     ; at least (Length+3)/4 bytes in size.
  18.     ;
  19.     ; Function of the JoinCode: See above.
  20.  
  21.  
  22.         XDEF @CompressADPCM2
  23. @CompressADPCM2
  24.         movem.l    d2-d4,-(sp)
  25.  
  26.         addq.l    #3,d0
  27.         lsr.l    #2,d0
  28.  
  29.         move.w    d1,d3            ; d3=EstMax
  30.         swap    d1
  31.         move.w    d1,d2            ; d2=Delta
  32.         bne.s    c2_entry
  33.         moveq    #5,d2
  34.         bra.s    c2_entry
  35.  
  36. c2_loop        lsl.b    #2,d1            ; d1=Shifter
  37.         bsr.s    c2_byte
  38.         lsl.b    #2,d1
  39.         bsr.s    c2_byte
  40.         lsl.b    #2,d1
  41.         bsr.s    c2_byte
  42.         lsl.b    #2,d1
  43.         bsr.s    c2_byte
  44.         move.b    d1,(a1)+
  45.  
  46. c2_entry    dbra    d0,c2_loop        ; d0=Counter
  47.         swap    d0
  48.         subq.w    #1,d0
  49.         bcs.s    c2_finished
  50.         swap    d0
  51.         bra.s    c2_loop
  52.  
  53. c2_finished    move.w    d2,d0            ; -> d0=JoinCode
  54.         swap    d0
  55.         move.w    d3,d0
  56.  
  57.         movem.l    (sp)+,d2-d4
  58.         rts
  59.  
  60. c2_byte        move.b    (a0)+,d4
  61.         ext.w    d4
  62.         asl.w    #6,d4
  63.         sub.w    d3,d4
  64.         bpl.s    c2_skip1
  65.         bset    #1,d1
  66.         neg.w    d4
  67. c2_skip1    cmp.w    d2,d4
  68.         bls.s    c2_skip2
  69.         bset    #0,d1
  70. c2_skip2    bsr.s    adaptive
  71.         rts
  72.  
  73.  
  74.  
  75.         *** Adaptions-Routine ***
  76.  
  77. adaptive    ; d1 = SignBit + DataBit
  78.  
  79.         move.w    d2,d4
  80.         lsr.w    #1,d4
  81.         btst    #0,d1
  82.         beq.s    d2_skip1
  83.         add.w    d2,d4
  84.         mulu    #$5600,d2
  85.         bra.s    d2_sign
  86. d2_skip1    mulu    #$3800,d2
  87. d2_sign        btst    #1,d1
  88.         beq.s    d2_skip2
  89.         neg.w    d4
  90. d2_skip2    add.w    d4,d3
  91.         add.l    #8192,d2
  92.         moveq    #14,d4
  93.         asr.l    d4,d2
  94.         rts
  95.  
  96.  
  97.         END
  98.